查看原文
其他

R可视乎|用R来拼图和排版,告别AI和PS(三)

Editor's Note

继续研究patchwork包。注:小编对原文进行了重新编排和小小的修改

The following article is from 生信交流平台 Author 生信交流平台

1.简介

前面我们已经通过三期的内容来讲解了如何使用R包patchwork拼图排版添加注释信息

  1. R可视乎|用R来拼图和排版,告别AI和PS(一)

  2. R可视乎|用R来拼图和排版,告别AI和PS(二)

今天我们来聊聊使用patchwork包进行布局插图

2.布局

首先我们需要先来了解一下patchwork中的area这个函数

这个函数有四个参数,t和b表示的是网格中上边界和下边界,而l和r表示的是网格中的左边界和右边界。

我们先来结合一个具体的例子来看一下这个函数的具体使用方法

#安装patchwork包
devtools::install_github("thomasp85/patchwork@v1.1.0")

#加载ggplot2和patchwork
library(ggplot2)
library(patchwork)

#定义三个区域
layout <- c(
  #如果只写两个参数,那么b = t, r = l
  area(11),
  #写三个参数,那个r = l
  area(133),
  area(3132)
)
#画出三个区域
plot(layout)

可以看到这是一个3*3的九宫格,第一个区域top和left都是1,bottom和right也都是1,所以在左上角第一个小格子里。第二个区域top是1,left是3,bottom和right都是3,所以对应的区域是图中绿色区域。依此类推,大家可以自己推导一下第三个区域是不是蓝色所显示的区域。

了解了area这个函数以后,我们利用前几次展示的数据来看看如何布局。

#图1 散点图
p1 <- ggplot(mtcars) + 
  geom_point(aes(mpg, disp)) + 
  ggtitle('plot1')

#图2 箱型图
p2 <- ggplot(mtcars) + 
  geom_boxplot(aes(gear, disp, group = gear)) + 
  ggtitle('plot2')

#图3 拟合曲线
p3 <- ggplot(mtcars) + 
  geom_smooth(aes(hp, wt)) +
  ggtitle('plot3')

#图4 柱形图
p4 <- ggplot(mtcars) + 
  geom_bar(aes(gear)) + 
  facet_wrap(~cyl) + 
  ggtitle('plot4')

#图5 histogram
p5 <- ggplot(mtcars) + 
  geom_histogram(aes(mpg)) + 
  ggtitle('plot5')

#采用上面构建的layout来展示p1,p1和p3
p1 + p2 + p3 + plot_layout(design = layout)

是不是跟上面的布局一样,只是用我们自己的plot1,plot2和plot3来替换了原来的红,绿和蓝三个色块。

可能有些读者觉得,这个坐标有点晕,那么接下来给大家介绍一个更加简单直白的layout设置方法,可以达到相同的效果。

layout <- "
##BBBB
AACCDD
##CCDD
"


#这里plot的顺序跟上面的A,B,C和D相对应
p1 + p2 + p3 + p4 + 
  plot_layout(design = layout)

其实,这也是一个九宫格,你可以细品一下。plot2对应B的位置,占第一行,第二三列。其他依此类推。

其实这里的layout写成下面的格式是一样的效果,大家可以体会一下这两种写法的区别。实际上上面那种写法,对应的是一个3*6的网格,而下面这种写法对应的是3*3的网格。

layout <- "
#BB
ACD
#CD
"

p1 + p2 + p3 + p4 + 
  plot_layout(design = layout)

接下来大家就可以自由发挥啦,

layout <- '
##A
#B#
C##
'

wrap_plots( p1,  p2,  p3, design = layout)

比如说这种对角线排布

layout <- '
A#B
#E#
C#D
'

#注意这里的对应关系
wrap_plots(A= p3, B=p5,  C=p2, D=p1,E=p4, design = layout)

还有这种“众星捧月”的形式
如果大家理解了原理,剩下的就是你的想象力了!

3.插图

有两种方法可以实现插图的效果。

3.1方法一:利用layout来实现

#重叠
layout <- c(
  area(t = 2, l = 1, b = 5, r = 4),
  area(t = 1, l = 3, b = 3, r = 5)
)
plot(layout)
layout的效果图

接下来,我们替换成自己的两张图片

p1 + p2 + 
  plot_layout(design = layout)

当然也可以将图B完全插入到图A内部,先来看看效果图

#在图A右上角插入图B
layout <- c(
  area(t = 1, l = 1, b = 8, r = 8),
  area(t = 1, l = 6, b = 3, r = 8)
)
plot(layout)

再来看看实际结果

p1 + p2 + 
  plot_layout(design = layout)

3.2方法二:使用inset_element()函数

#默认align_to为panel,只包含绘图区域
#这里的left,bottom,right,top都是按百分比计算
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1)

注意inset_element有一个参数叫align_to,默认值是"panel",你可以看到图B完全在图A的绘图区域里面。下面我们再来看看,如果把这里的align_to设置成"full"会是什么效果。

#aligan_to设置为full,会包含margin区域
p1 + inset_element(p2, left = 0.6, bottom = 0.6, right = 1, top = 1,
                    align_to = 'full')

我们可以看到当align_to = 'full'的时候,这里考虑到了图A的边界区域,就是写标题"A"的区域,跟上面一张图对比,你就会发现其中的区别。

理解了这里的参数之后,想把图B插入到图A的左下角也很容易

#左下角
p1 + inset_element(p2, left = 0, bottom = 0, right = 0.6, top = 0.5)

当然,我们还可以人为定义边距的大小

#图B的上边和右边各留出1cm
p1 + inset_element(
  p2, 
  left = 0.5
  bottom = 0.5
  right = unit(1'npc') - unit(1'cm'), 
  top = unit(1'npc') - unit(1'cm')
)

到这里,我们对patchwork这个包的讲解就全部结束了,希望对大家有所帮助!

拓展

如果想进一步学习,可以参考以下几篇其他公众号的推文以及他的官网[1]Rdocumentation[2]以及PDF教程[3]

参考资料

[1]

官网: https://www.rdocumentation.org/packages/patchwork/versions/1.1.1

[2]

Rdocumentation: https://patchwork.data-imaginist.com/articles/patchwork.html

[3]

PDF教程: https://www.bing.com/search?q=patchwork%20r&qs=n&form=QBRE&sp=-1&pq=patchwork%20&sc=8-10&sk=&cvid=5B39EB1F695F44D1980802D51846501E


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存